#!/bin/sh

# ===========================================================================
# 功能: 项目启动脚本
# 作者: x
# 时间: 2024-06-20
# 注意: 脚本建议以root权限执行,
# 使用方式: 将此脚本放置在jar同级目录下 ./x.sh start 启动 stop 停止 restart 重启 status 状态 log 日志 back 备份
# ===========================================================================

AppName=main_24_10_24_fastapi.py
#获取项目路径
APP_HOME=$(dirname "$(readlink -f "$0")")
TIME=`date +'%Y%m%d%H%M%S'`
#指定日志地址
LOG_HOME=$APP_HOME/logs
#指定备份地址
BACK_HOME=$APP_HOME/back



echo "项目路径:$APP_HOME"

# 检查操作名和应用名是否提供
if [ -z "$1" ]; then
    echo -e "\033[0;31m 未输入操作名，请输入 {start|stop|restart|log} \033[0m"
    exit 1
fi

function log() {
    if [ ! -d "$LOG_HOME" ]; then
        mkdir -p "$LOG_HOME" || { echo "创建 文件夹 失败"; return 1; }
    fi
    local logFile="$LOG_HOME/$AppName.log"
    if [ ! -f "$logFile" ]; then
        touch "$logFile" || { echo "文件 创建 错误"; return 1; }
    fi
    tail -f  "$logFile"
}

function path(){
    CMD="cd $APP_HOME"
    history -s "$CMD"
    echo "$CMD"
}

function start() {
#      如果是开启状态
      if pgrep -f "$AppName" > /dev/null; then
        echo "$AppName is already running..."
        exit 1
      fi
      nohup sf > "$LOG_HOME/$AppName.log" 2>&1 &
      log
      echo "Start $AppName success..."
}

function stop() {
    echo -e "\033[0;33m Stopping $AppName \033[0m"
    # 尝试发送温和的终止信号
    pkill -f -15 "$AppName"
    # 检查是否成功停止，如果没有，再尝试使用更强的信号
    sleep 2
    if pgrep -f "$AppName" > /dev/null; then
        echo -e "\033[0;31m 进程仍在运行，使用更强的信号终止 \033[0m"
        pkill -f -9 "$AppName"
    else
        echo -e "\033[0;32m $AppName 已经停止 \033[0m"
    fi
}

function restart(){
    stop
    sleep 2
    start
}

function status() {
    echo -e "\033[0;33m Checking status of $AppName \033[0m"
    # 使用 pgrep 查找进程，并显示详细信息
    if pgrep -f "$AppName" > /dev/null; then
        ps -ef | grep "$AppName" | grep -v grep | awk '{print "PID: " $2 "\tCommand: " $8}'
    else
        echo -e "\033[0;31m $AppName is not running \033[0m"
    fi
}

case $1 in
    start)
    start;;
    stop)
    stop;;
    log)
    log;;
    restart)
    restart;;
    status)
    status;;
    path)
    path;;
    *)

esac
